package com.nolon.flange.tools

import java.text.DateFormat
import java.text.ParseException
import java.text.SimpleDateFormat
import java.util.*

/**
 * 获取当前的日期格式为:yyyy-MM-dd HH:mm:ss
 *
 * @author Arthur(user_006)
 * @version 1.0.0 2010/04/24 14:00(星期六)
 */
object TimeFormat {
    /**
     * 获取当前的日期 , 默认格式
     *
     * @return 当前的日期
     */
    @get:Synchronized
    val currentCalendar: Date
        get() {
            val calendar = Calendar.getInstance()
            return calendar.time
        }

    /**
     * 获取当前日期 , 格式yyyy-MM-dd , 如: 2010-04-24
     *
     * @return
     */
    @get:Synchronized
    val currentDate: String
        get() {
            val calendar = Calendar.getInstance()
            val sb = StringBuffer()
            sb.append(calendar[Calendar.YEAR]).append("-")
            sb.append(calendar[Calendar.MONTH] + 1).append("-")
            sb.append(calendar[Calendar.DAY_OF_MONTH])
            return sb.toString()
        }

    /**
     * 把字符形式的日期转换成Date类型 , 格式yyyy-MM-DD
     *
     * @param date 日期的字符串形式
     * @return Data类型的日期
     */
    @Synchronized
    fun convertToDate(date: String?): Date? {
        val format: DateFormat = SimpleDateFormat("yyyy-MM-DD", Locale.getDefault())
//        val format: DateFormat = SimpleDateFormat("yyyy-MM-DD")
        try {
            return format.parse(date)
        } catch (e: ParseException) {
            e.printStackTrace()
        }
        return null
    }

    /**
     * 把日期转换为指定的格式
     *
     * @param date    要转换的日期
     * @param pattern 转换的格式
     * @return
     */
    @Synchronized
    fun format(date: Date?, pattern: String?): Date? {
        if (pattern != null && pattern.trim { it <= ' ' }.isNotEmpty()) {
            val format: DateFormat = SimpleDateFormat(pattern, Locale.getDefault())
            val stringDate = format.format(date)
            return convertToDate(stringDate)
        }
        return null
    }

    /**
     * 将日期转换为字符串 , 格式yyyy-MM-dd HH:mm:ss
     *
     * @param date 要转换的日期
     * @return
     */
    @Synchronized
    fun convertToString(date: Date?): String {
        val format: DateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault())
        return format.format(date)
    }

    /**
     * 将日期转换为字符串 , 格式yyyy-MM-dd HH:mm:ss
     *
     * @param date 要转换的日期
     * @return
     */
    @Synchronized
    fun convertToStrShort(date: Date?): String {
        val format: DateFormat = SimpleDateFormat("yyyy-MM-dd", Locale.getDefault())
        return format.format(date)
    }

    /**
     * 将日期转换为字符串 , 格式yyyyMMddHHmmss
     *
     * @param date 要转换的日期
     * @return
     */
    @Synchronized
    fun convertToString2(date: Date?): String {
        val format: DateFormat = SimpleDateFormat("yyyyMMddHHmmss", Locale.getDefault())
        return format.format(date)
    }

    /**
     * 将日期转换为指定格式的字符串
     *
     * @param date       要转换的日期
     * @param formatText 转换的格式
     * @return
     */
    @Synchronized
    fun convertToString(
        date: Date?,
        formatText: String?
    ): String {
        val format: DateFormat = SimpleDateFormat(formatText, Locale.getDefault())
        val calendar = Calendar.getInstance()
        val sb = StringBuffer()
        sb.append(calendar[Calendar.YEAR]).append("-")
        sb.append(calendar[Calendar.MONTH] + 1).append("-")
        sb.append(calendar[Calendar.DAY_OF_MONTH])
        return format.format(date)
    }// 这里设置从周一開始,若须要依据系统时区自己主动获取，则採用下边的方式

    /**
     * 获取本周一的日期
     *
     * @return
     */
    @get:Synchronized
    val mondayOFWeek: Date
        get() {
            val calendar = Calendar.getInstance()
            calendar[Calendar.DAY_OF_WEEK] = Calendar.MONDAY // 这里设置从周一開始,若须要依据系统时区自己主动获取，则採用下边的方式
            return calendar.time
        }// 把当前日期的DATE加上当前日期与本周日之间相差的天数

    /**
     * 获取本周日日期
     *
     * @return
     */
    @get:Synchronized
    val currentWeekday: Date
        get() {
            val calendar = Calendar.getInstance()
            calendar.add(Calendar.DATE, currentPlus) // 把当前日期的DATE加上当前日期与本周日之间相差的天数
            return calendar.time
        }// calendar.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY+7);
    // 把当前日期的DATE加上当前日期与本周日之间相差的天数
    /**
     * 获取上周日的日期
     *
     * @return
     */
    @get:Synchronized
    val previousWeekday: Date
        get() {
            val calendar = Calendar.getInstance()
            // calendar.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY+7);
            calendar.add(Calendar.DATE, currentPlus - 7) // 把当前日期的DATE加上当前日期与本周日之间相差的天数
            return calendar.time
        }// calendar.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY+7);
    // 把当前日期的DATE加上当前日期与本周日之间相差的天数
    /**
     * 获取上周日的日期
     *
     * @return
     */
    @get:Synchronized
    val previousMonday: Date
        get() {
            val calendar = Calendar.getInstance()
            // calendar.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY+7);
            calendar.add(Calendar.DATE, currentPlus - 13) // 把当前日期的DATE加上当前日期与本周日之间相差的天数
            return calendar.time
        }// calendar.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY+7);
    // 把当前日期的DATE加上当前日期与本周日之间相差的天数
    /**
     * 获取上周日的日期
     *
     * @return
     */
    @get:Synchronized
    val nextWeekday: Date
        get() {
            val calendar = Calendar.getInstance()
            // calendar.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY+7);
            calendar.add(Calendar.DATE, currentPlus + 1 + 6) // 把当前日期的DATE加上当前日期与本周日之间相差的天数
            return calendar.time
        }// calendar.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY+7);
    // 把当前日期的DATE加上当前日期与本周日之间相差的天数
    /**
     * 获取上周日的日期
     *
     * @return
     */
    @get:Synchronized
    val nextMonday: Date
        get() {
            val calendar = Calendar.getInstance()
            // calendar.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY+7);
            calendar.add(Calendar.DATE, currentPlus + 1) // 把当前日期的DATE加上当前日期与本周日之间相差的天数
            return calendar.time
        }// 在中国是已星期一作为一周的第一天,所以这里减1

    /**
     * 获取当前日期与本周周日之间相差的天数
     *
     * @return
     */
    @get:Synchronized
    val currentPlus: Int
        get() {
            val calendar = Calendar.getInstance()
            val days = calendar[Calendar.DAY_OF_WEEK] - 1 // 在中国是已星期一作为一周的第一天,所以这里减1
            return 7 - days
        }

    @get:Synchronized
    val currentYear: Int
        get() {
            val calendar = Calendar.getInstance()
            return calendar[Calendar.YEAR]
        }

    /**
     * 返回指定日期的当月第一天
     *
     * @param date
     * @return
     */
    @Synchronized
    fun getFirstDayInMonth(date: Date?): Date {
        val calendar = Calendar.getInstance()
        calendar.time = date
        calendar[Calendar.DATE] = 1
        return calendar.time
    }

    /**
     * 返回指定日期的当月最后一天
     *
     * @param date
     * @return
     */
    @Synchronized
    fun getLastDayInMonth(date: Date?): Date {
        val calendar = Calendar.getInstance()
        calendar.time = date
        calendar.add(Calendar.MONTH, 1)
        calendar[Calendar.DATE] = 1
        calendar.add(Calendar.DATE, -1)
        return calendar.time
    }

    /*
     * 计算两个日期之间的天数
     */
    fun getDaysBetween(d1_: Calendar, d2_: Calendar): Int {
        var d1 = d1_
        var d2 = d2_
        if (d1.after(d2)) {
            val swap = d1
            d1 = d2
            d2 = swap
        }
        var days = d2[Calendar.DAY_OF_YEAR] - d1[Calendar.DAY_OF_YEAR]
        val y2 = d2[Calendar.YEAR]
        if (d1[Calendar.YEAR] != y2) {
            d1 = d1.clone() as Calendar
            do {
                days += d1.getActualMaximum(Calendar.DAY_OF_YEAR) // 得到当年的实际天数
                d1.add(Calendar.YEAR, 1)
            } while (d1[Calendar.YEAR] != y2)
        }
        return days
    }

    /*
     * 计算两个日期之间的时间
     */
    fun getGapTime(createTime: Date?): String {
        val d2 = Calendar.getInstance()
        val d1 = Calendar.getInstance()
        d1.time = createTime
        val days = d2[Calendar.DAY_OF_YEAR] - d1[Calendar.DAY_OF_YEAR]
        return if (days < 1) {
            val hour = (d2[Calendar.HOUR_OF_DAY]
                    - d1[Calendar.HOUR_OF_DAY])
            if (hour < 1) {
                val munites = d2[Calendar.MINUTE] - d1[Calendar.MINUTE]
                if (munites == 0) {
                    "刚刚"
                } else {
                    munites.toString() + "分钟前"
                }
            } else {
                hour.toString() + "小时前"
            }
        } else {
            days.toString() + "天前"
        }
    }

    //加天数
    fun addDays(day: Int): String {
        val calendar = Calendar.getInstance()
        calendar.add(Calendar.DAY_OF_MONTH, day)
        val sb = StringBuffer()
        sb.append(calendar[Calendar.YEAR]).append("-")
        sb.append(calendar[Calendar.MONTH] + 1).append("-")
        sb.append(calendar[Calendar.DAY_OF_MONTH])
        return sb.toString()
    }

    //加年份
    @Throws(ParseException::class)
    fun addYears(now: String?, year: Int): String {
        val fromCal = Calendar.getInstance()
        val dateFormat: DateFormat = SimpleDateFormat("yyyy-MM-dd")
        val date = dateFormat.parse(now)
        fromCal.time = date
        fromCal.add(Calendar.YEAR, year)
        return dateFormat.format(fromCal.time)
    }

    //加天数(特定时间)
    @Throws(ParseException::class)
    fun addDate(now: String?, day: Int): String {
        val fromCal = Calendar.getInstance()
        val dateFormat: DateFormat = SimpleDateFormat("yyyy-MM-dd")
        val date = dateFormat.parse(now)
        fromCal.time = date
        fromCal.add(Calendar.DATE, day)
        return dateFormat.format(fromCal.time)
    }

    /**
     * 格多少时间
     *
     * @throws ParseException
     */
    @Throws(ParseException::class)
    @JvmStatic
    fun main(args: Array<String>) {
        println(addYears("2008-12-01", 7))
    } /*public static void main(String[] args) {
			   String createDate = "2008-12-01";
			   SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd");
			   try {
			    Date date = sdf.parse(createDate);
			    Calendar cl = Calendar.getInstance();
			    cl.setTime(date);
			    cl.add(Calendar.DATE,31);
			    String temp = "";
			    temp = sdf.format(cl.getTime());
			    System.out.println(temp);
			   } catch (ParseException e) {
			    // TODO Auto-generated catch block
			    e.printStackTrace();
			   }
			}*/
}